//=============================================================================
/**
 *
 *	@file		museum_util.c
 *	@brief		ポケスロン ミュージアム用 便利関数群
 *	@author		hosaka genya
 *	@data		2008.07.30
 *
 */
//=============================================================================
#include "common.h"
#include "system/wipe.h"
#include "poketool/monsno.h"

#include "museum_util.h"

//=============================================================================
/**
 *								定数定義
 */
//=============================================================================
enum
{
	SCORE_TROPHY_SINGLE	= 420,	///< このスコアを超えるとトロフィーがつく
	SCORE_TROPHY_DOUBLE	= 450,	///< このスコアを超えるとダブルトロフィーがつく
	MEDAL_MAX = 5,	///< メダルの数
};

//=============================================================================
/**
 *								構造体定義
 */
//=============================================================================

//=============================================================================
/**
 *							プロトタイプ宣言
 */
//=============================================================================
static void COMMON_SetBank( void );

//=============================================================================
/**
 *								外部公開関数
 */
//=============================================================================

//-----------------------------------------------------------------------------
/**
 *	@brief	終了チェック（キー入力、タッチ）
 *
 *	@param	void
 *
 *	@retval TRUE:終了
 */
//-----------------------------------------------------------------------------
BOOL MUSEUM_UTIL_CheckExit( void )
{
	enum { POS_EXIT_X = 28*8,	POS_EXIT_Y = 22*8, };

	const TP_HIT_TBL hit_tbl = { POS_EXIT_Y-2*8, POS_EXIT_Y+2*8, POS_EXIT_X-4*8, POS_EXIT_X+4*8 };	///< もどるボタン

	BOOL ret = FALSE;

	if( GF_TP_SingleHitTrg( &hit_tbl ) || ( sys.trg & PAD_BUTTON_CANCEL ) )
	{
		ret = TRUE;
	}

	return ret;
}


//-----------------------------------------------------------------------------
/**
 *	@brief	コースのスコアから、トロフィーのタイプを算出
 *
 *	@param	u16 score
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
MUSEUM_TROPHY MUSEUM_UTIL_GetCourseTrophyCount( u16 score )
{
	if( score >= SCORE_TROPHY_DOUBLE )
	{
			return MUSEUM_TROPHY_DOUBLE;
	}
	else if( score >= SCORE_TROPHY_SINGLE )
	{
			return MUSEUM_TROPHY_SINGLE;
	}

	return MUSEUM_TROPHY_NONE;
};

//-----------------------------------------------------------------------------
/**
 *	@brief	ポケモンレコードのトロフィー数を算出
 *
 *	@param	u16 mdlst_poke_cnt	メダリストポケモンの数
 *
 *	@retval u8
 */
//-----------------------------------------------------------------------------
#include "museum_pokemon_trophy_tbl.dat"
u8 MUSEUM_UTIL_GetPokemonTrophyCount( u16 mdlst_poke_cnt )
{
	u8 tbl_max;
	u8 i;

	tbl_max = NELEMS(museum_pokemon_trophy_tbl);

	for(i=0; i<tbl_max; i++)
	{
		if( museum_pokemon_trophy_tbl[i] <= mdlst_poke_cnt ){ break; }
	};

	return tbl_max - i;
}

//-----------------------------------------------------------------------------
/**
 *	@brief	イベントレコードの初期スコア、目的スコア
 *
 *	@param	u16 score		スコア
 *	@param	b_pkth_clear	ミュージアム４開放フラグ
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
u16 MUSEUM_UTIL_GetEventDefaultRecord( u16 ev_idx, BOOL b_pkth_clear )
{
	static const u16 lim_tbl[][2] =
	{
		{ PKTH_DEF_REC_DASH*30,	PKTH_DEF_REC2_DASH*30 },
		{ PKTH_DEF_REC_STEAL,	PKTH_DEF_REC2_STEAL },
		{ PKTH_DEF_REC_PUSH,	PKTH_DEF_REC2_PUSH },
		{ PKTH_DEF_REC_BREAK,	PKTH_DEF_REC2_BREAK },
		{ PKTH_DEF_REC_CATCH,	PKTH_DEF_REC2_CATCH },
		{ PKTH_DEF_REC_JUMP,	PKTH_DEF_REC2_JUMP },
		{ PKTH_DEF_REC_RUN*1024,PKTH_DEF_REC2_RUN*1024 },
		{ PKTH_DEF_REC_DROP,	PKTH_DEF_REC2_DROP },
		{ PKTH_DEF_REC_THROW,	PKTH_DEF_REC2_THROW },
		{ PKTH_DEF_REC_SHOT,	PKTH_DEF_REC2_SHOT },
	};

	return lim_tbl[ ev_idx ][ b_pkth_clear ];
}

//-----------------------------------------------------------------------------
/**
 *	@brief	競技の得点が規定値を超えていたかチェック
 *
 *	@param	u8 ev_idx		競技インデックス
 *	@param	b_pkth_clear	ミュージアム４開放フラグ
 *	@param	rec				レコード得点
 *
 *	@retval TRUE:超えた / FALSE:超えてない
 */
//-----------------------------------------------------------------------------
BOOL MUSEUM_UTIL_CheckEventRecordFlag( u8 ev_idx, BOOL b_pkth_clear, u16 rec )
{
	u16 def = MUSEUM_UTIL_GetEventDefaultRecord( ev_idx, b_pkth_clear );

	// データがないときは超えようがない
	if( rec == REC_NO_DATA ){ return FALSE; }

	// ハードルのみ、値が小さいほうが有利
	if( ev_idx == PKTHLN_EVT_DASH )
	{
		return ( rec < def );
	}
	else
	{
		return ( rec > def );
	}
}

//-----------------------------------------------------------------------------
/**
 *	@brief	競技の得点が規定値を超えていたかチェック(同点可)
 *
 *	@param	u8 ev_idx		競技インデックス
 *	@param	b_pkth_clear	ミュージアム４開放フラグ
 *	@param	rec				レコード得点
 *
 *	@retval TRUE:超えた / FALSE:超えてない
 */
//-----------------------------------------------------------------------------
BOOL MUSEUM_UTIL_CheckEventRecordFlagTai( u8 ev_idx, BOOL b_pkth_clear, u16 rec )
{
	u16 def = MUSEUM_UTIL_GetEventDefaultRecord( ev_idx, b_pkth_clear );

	// データがないときは超えようがない
	if( rec == REC_NO_DATA ){ return FALSE; }

	// ハードルのみ、値が小さいほうが有利
	if( ev_idx == PKTHLN_EVT_DASH )
	{
		return ( rec <= def );
	}
	else
	{
		return ( rec >= def );
	}
}


//-----------------------------------------------------------------------------
/**
 *	@brief	各競技の得点を取得
 *
 *	@param	PKTH_EVT_DATA* dat	イベントデータへのポインタ
 *	@param	rnk_idx				ランキングのインデックス(0が一位)
 *
 *	@retval	u16 各競技の得点
 *
 */
//-----------------------------------------------------------------------------
u16 MUSEUM_UTIL_GetEventRecord( const PKTH_EVT_DATA* dat, u8 rnk_idx )
{
	return dat->RcMs[ rnk_idx ].Record;
}

//-----------------------------------------------------------------------------
/**
 *	@brief	メダリストポケモン（メダルを全て獲得したポケモン）の数を算出
 *
 *	@param	const u8* p_mdl
 */
//-----------------------------------------------------------------------------
u16 MUSEUM_UTIL_GetMedalistPokemonCount( const u8* p_mdl )
{
	int i;
	u16 ret = 0;

	GF_ASSERT( p_mdl );

	for( i=0; i<MONSNO_END; i++ )
	{
		if( MATH_CountPopulation( p_mdl[i] ) == MEDAL_MAX )
		{
			ret++;
		}
	}

	return ret;
}

//-----------------------------------------------------------------------------
/**
 *	@brief	イベントで獲得したトロフィーの数
 *
 *	@param	const PKTH_EVT_DATA* p_ev
 */
//-----------------------------------------------------------------------------
u8 MUSEUM_UTIL_GetEventTrophyCount( const PKTH_EVT_DATA* p_ev )
{
	u8 i;
	u8 ret = 0;

	for( i=0; i < PKTHLN_EVT_MAX; i++)
	{
		u16 rec;

		rec = MUSEUM_UTIL_GetEventRecord( &p_ev[i], 0 ); ///< 一位のレコード
		if( MUSEUM_UTIL_CheckEventRecordFlagTai( i, TRUE, rec ) ){ ret++; }
	}

	return ret;
}


//-----------------------------------------------------------------------------
/**
 *	@brief	汎用初期化処理
 *
 *	@param	void
 *
 *	@retval	none
 */
//-----------------------------------------------------------------------------
void MUSEUM_COMMON_Init( void )
{
	WIPE_SetBrightness( WIPE_DISP_MAIN, WIPE_FADE_BLACK );
	WIPE_SetBrightness( WIPE_DISP_SUB,  WIPE_FADE_BLACK );

	sys_VBlankFuncChange( NULL, NULL );
	sys_HBlankIntrStop();

	GF_Disp_GX_VisibleControlInit();
	GF_Disp_GXS_VisibleControlInit();
	GX_SetVisiblePlane( 0 );
	GXS_SetVisiblePlane( 0 );

	GX_SetDispSelect( GX_DISP_SELECT_SUB_MAIN );

	COMMON_SetBank();
}

//-----------------------------------------------------------------------------
/**
 *	@brief	汎用終了処理
 *
 *	@param	void
 *
 *	@retval	none
 */
//-----------------------------------------------------------------------------
void MUSEUM_COMMON_Release( void )
{
	sys_VBlankFuncChange( NULL, NULL );
	sys_HBlankIntrStop();

	GF_Disp_GX_VisibleControlInit();
	GF_Disp_GXS_VisibleControlInit();
	GX_SetVisiblePlane(0);
	GXS_SetVisiblePlane(0);
}

//-----------------------------------------------------------------------------
/**
 *	@brief	指定した桁の値を取得
 *
 *	@param	int src	元の値
 *	@param	pos	指定桁(1-4)
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
int UTIL_GetFigreAppoint( int src ,u8 pos )
{
	static const u32 n_tbl[] =
	{
		1, 10, 100, 1000, 10000,
	};

	GF_ASSERT( pos > 0 && pos < 5 );

	return src % n_tbl[ pos ] / n_tbl[ pos-1 ];
}

//----------------------------------------------------------------------------
/**
 *	指定した数値の桁数を取得
 *
 *	@param	int num	ソース
 *
 *	@return int 桁数
 */
//-----------------------------------------------------------------------------
u8 UTIL_GetFigure( int num )
{
	u8 cnt = 0;
	int n = num;

	// 例外処理
	if (num == 0)	return 1;

	while(1)
	{
		if(n==0) break;
		n /=10;
		cnt++;
	}

	return cnt;
}

//=============================================================================
/**
 *								static関数
 */
//=============================================================================

//-----------------------------------------------------------------------------
/**
 *	@brief	バンクの設定
 *
 *	@param	void
 *
 *	@retval	none
 */
//-----------------------------------------------------------------------------
static void COMMON_SetBank( void )
{
	GF_BGL_DISPVRAM vramSetTable = {
		GX_VRAM_BG_128_A,				// メイン2DエンジンのBG
		GX_VRAM_BGEXTPLTT_NONE,			// メイン2DエンジンのBG拡張パレット
		GX_VRAM_SUB_BG_128_C,			// サブ2DエンジンのBG
		GX_VRAM_SUB_BGEXTPLTT_NONE,		// サブ2DエンジンのBG拡張パレット
		GX_VRAM_OBJ_128_B,				// メイン2DエンジンのOBJ
		GX_VRAM_OBJEXTPLTT_NONE,		// メイン2DエンジンのOBJ拡張パレット
		GX_VRAM_SUB_OBJ_16_I,			// サブ2DエンジンのOBJ
		GX_VRAM_SUB_OBJEXTPLTT_NONE,	// サブ2DエンジンのOBJ拡張パレット
		GX_VRAM_TEX_NONE,				// テクスチャイメージスロット
		GX_VRAM_TEXPLTT_NONE			// テクスチャパレットスロット
	};
	//※ ポケモンではD面を通信用に使うので、他の用途に割り当ててはいけない

	GF_Disp_SetBank( &vramSetTable );
}
